package flare.physics
{
  /**
   * Force simulating frictional drag forces (e.g., air resistance). For
   * each particle, this force applies a drag based on the particles
   * velocity (<code>F = a * v</code>, where a is a drag co-efficient and
   * v is the velocity of the particle).
   */
  public class DragForce implements IForce
  {
    private var _dc:Number;

    /** The drag co-efficient. */
    public function get drag():Number
    {
      return _dc;
    }

    public function set drag(dc:Number):void
    {
      _dc = dc;
    }

    /**
     * Creates a new DragForce with given drag co-efficient.
     * @param dc the drag co-efficient.
     */
    public function DragForce(dc:Number = 0.1)
    {
      _dc = dc;
    }

    /**
     * Applies this force to a simulation.
     * @param sim the Simulation to apply the force to
     */
    public function apply(sim:Simulation):void
    {
      if(_dc == 0)return;

      for(var i:uint = 0; i < sim.particles.length; ++i)
      {
        var p:Particle = sim.particles[i];
        p.fx -= _dc * p.vx;
        p.fy -= _dc * p.vy;
      }
    }
  } // end of class DragForce
}